//
//  LCNote.swift
//  SwiftWeiBo
//
//  Created by LiCheng on 2017/2/8.
//  Copyright © 2017年 LiCheng. All rights reserved.
//

import UIKit

class LCNote: NSObject {


/**
     1. 设置显示启动图片时， 不显示状态栏
     
        - 在 General 中， 找到 hide status bar  勾选上就可以了


     
     2. 桥接文件

        - 专门用于引用 OC 的头文件
        - 一旦引入， swift 就可以正常使用 oc 文件 （宏除外）
        - 需要设置 build Settings -> 搜索 bridg -> oc bridging header -> 项目名/目录/桥接文件名称.h



     3. extension

        - 类似于 oc 中的分类
        - 在 swift 中还可以用来切分代码块
        - 可以把 “函数” 按照 功能 分类管理， 便于阅读和维护
        - 便于代码维护
        - 注意:
            - extension 中 不能有属性!
            - extension 中 可以有 计算性属性 不会占用存储空间
            - extension 中 不能重写父类本类的方法!（不是扩展中的方法） 重写父类方法是子类的职责， 扩展是定义新的方法


     
     4. 容错点

        - tabbar 中，每个按钮之间 会有 1个点的 距离， 叫容错点
        - 使用自定义按钮覆盖时，要注意容错点，避免造成点击到后面的真正按钮
     
     

     5. @objc
        
        - 允许 这个函数 在运行时通过 OC 的消息发送机制 被调用

     

     6. 私有 priavte / fileprivate

        - private  是真正的私有，离开了这个类或者结构体的作用域外面就无法访问
        - fileprivate 是在 swift 中增加的，来显式声明，表示这个元素的访问权限为文件内私有
     
     

     7. swift 调用 oc 方法

        - swift 调用 oc 返回值为 instancetype 的方法时，判断不出是否可选
        - swift 默认 都给设置了可选， 后面使用的时候就需要 ？/ ! 解包
        - 我们使用的时候， 在定义时 指定类型， 可以避免 使用 ？/ ！
     
     

     8. 查看 代码行数
        
        - 命令行: cd 项目目录
        - find . -name "*.swift" | xargs wc -l



     9. 查看当前方法在哪里调用了
        
        - 在当前方法上， 右键 -> 选择 Find Call Hierarchy
     


     10. 在文件内 搜索 方法名 或者 属性
        
        - control + 6  会出现 方法名和属性列表
        - 再次按: control + 6 然后输入 要搜索的字段
     


     11. 代码控制 设备的横竖屏方向
     
        - 使用 supportedInterfaceOrientations
        - 用代码控制设备的方向，可以再需要横屏时，单独设置
        - 设置支持的方向之后，当前的控制器以及子控制器都会遵守这个方向
        - 如果播放视频，通常是通过 modal 来展现
        -  .porttait:  竖屏(肖像)
        -  .landscape: 横屏(风景画)
     
     

     12. 继承的问题

        - OC 中， 不支持多继承， 可以使用 协议 替代
            - @interface LC1ViewController()<UITableViewDataSource, UITableViewDelegate>
        - swift 中, 写法类似于多继承
            - class LCBaseViewController: UIViewController, UITabBarDelegate, UITableViewDataSource {}
     
     
     
     13. 使用苹果原生 自动布局
     
        方式1: 

        - 公式: view1.attr1 = view2.attr2 * multiplier + constant
                - 任何一个视图的属性 = 其他视图的属性 * 一个乘积 + 常数

        addConstraint(NSLayoutConstraint(
                        item: smallIconView,  // 任何一个视图
                        attribute: .centerX,  // 要约束的属性
                        relatedBy: .equal,    // 约束关系: 等于 大于等于 小于等于
                        toItem: self,         // 参照视图
                        attribute: .centerX,  // 参照属性
                        multiplier: 1.0,      // 乘积 (倍数关系)
                        constant: 0))         // 常数  - 向上/向左  + 向下/向右

        方式2:

        - 规则:
            - H :  水平方向 设置内容
            - V :  垂直方向
            - | :  边界
            - []:  包含控件的名称字符串， 对应关系在 views 字典中定义
            - ():  定义控件的宽/高，在 metrics 中指定
     
        - views:   定义 VFL 中 控件名称和字符串实际名 映射关系
        - metrics: 定义 VFL 中 () 指定常数 映射关系

        let viewDict = ["maskIconView": maskIconView, "registerBtn": registerBtn] as [String : Any]

        addConstraints(NSLayoutConstraint.constraints(
                withVisualFormat: "H:|-0-[maskIconView]-0-|",
                options: [],
                metrics: nil,
                views: viewDict))


     
     14. 颜色
        
        - 在 设置颜色时， 尽可能的使用 颜色， 不要使用图片， 提高效率
     
     
     
     15. 动画
        
        - 想要设置连续的动画时（切换界面回来后，动画继续），需要设置下面的属性
        - anim.isRemovedOnCompletion = false 

     

     16. 动态加载 界面
        
        - 将 设计界面用到的信息，写到 json 中， 从服务器获取 json 数据
        - 根据 json 数据的内容来显示界面
        - 实现动态修改界面 UI
        - 例如: 淘宝 双11 时 app tabbar 的标题和图片



     17. 异常处理
     
        - 反序列化是会剖出异常 throw
        - 解决异常
        - 方式1:
            - try? 弱 try
            - 推荐使用！ 如果解析成功有值， 否则没有为 nil

        - 方式2:
            - try! 强 try
            - 强烈不推荐！ 如果解析成功有值， 否则崩溃， 有风险
     
        - 方式3:
            - do{ 成功 } catch{ 失败 }
            - 能够接收到错误信息，处理错误， 但是 语法复杂
     
        - OC中 用人用 try catch 么？ 没人用
            - 在 ARC 中， 编译器自动添加 retain / release / autorelease
            - 如果使用 try catch 一旦不平衡就会造成内存泄露


     
     
     18. 代理 和 add Target 的区别
     
        - 代理是为了在控制器和视图之间解耦， 让视图能够被多个控制器调用， 例如 uitableview
        - add target 是高耦合的, 仅仅是为了封装代码，从控制器中剥离出来,
        - 该视图如果在其他地方被广泛的使用， 就使用: 代理  否则使用 add Target
     
     
     
     19. 第三方 授权模式
     
        - 第一方: 门户网站  第二方: 用户 第三方: app
        - 只会获取到用户的昵称头像性别等等， 涉及到钱的信息一般获取不到 比如: 身份证号，手机号，邮箱
        - 获取 AccessToken 通过 AccessToken 来获取数据

        - 1. SSO 第三方框架
            - 更人性化
            - 在真机上， 如果用户安装了门户应用，可以直接跳转到门户应用进行授权
            - 授权完毕后自动回到应用程序
            - 如果用户没有安装门户应用， 会以 OAuth的方式登录
     
        
        - 2. OAuth 
            - 获取 AccessToken 访问令牌
            - 用户通过门户登录网站进行登录，登录成功后获取授权码
            - app 使用 （ 授权码 ） 和 （ app 在门户网站第三方管理平台注册的key ） 来获取 AccessToken
            - 获取成功后 app 可以使用 AccessToken 来向门户网站访问有限的数据

     
     
     20. 单例 
        
        - swift 中使用 : static let shared = tool() 来创建
        - oc 中使用 : dispath ones 
     
     
     
     21. 枚举
        
        - 在 swift 中枚举支持任何类型
        - 在 OC 中 witch / enum 只支持 整数
        - 参数 使用 “ case 参数 ” 来创建
        - swift 的枚举 参数之间不需要逗号
     

     
     22. 创建数据模型时， 父类的选择

        - 如果类需要使用 kvc 或者 字典转模型框架设置对象值时， 类就需要继承自 NSObejct
        - 如果类只是包装了一些逻辑代码（函数），就可以不用任何类， 好处: 更加轻量级
        - 提示: oc 中都是继承自 NSObject


     
     23. 获取用户授权
        - 获取用户授权显示通知栏【上方提示条, 声音, badgeNumber】
        - #available 是检测设备版本
     
        if #available(iOS 10.0, *) { // 10.0
            UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge, .carPlay]) { (success, error) in
                print("授权" + (success ? "成功" : "失败"))
            }
        } else { // 10.0以下
            let setting = UIUserNotificationSettings(types: [.alert, .sound, .badge], categories: nil)
            application.registerUserNotificationSettings(setting)
        }
     
     
     
     24. webView 注入 

        - 执行 JS 代码的方法
            -> webView.stringByEvaluatingJavaScript(from: “js 代码”)
        - webView 的注入， 直接通过 js 修改本地浏览器中缓存的内容
        - 点击登录按钮，执行 submit() 将本地数据提交给服务器
     
     
     
     25. 数据的保存方式

        - 1. 偏好设置 - （存小的）
        - 2. 沙盒 - 归档/plist/ json
        - 3. 数据库 - （FMDB/CoreData）
        - 4. 钥匙串访问 - （存小数据，自动加密， 需要使用框架 SSKeychain）
     
     
     26. 网络请求 异步 应该返回什么？
     
        - 需要什么返回什么
        - 定时刷新的 不需要返回失败
     
     
     
     27. 版本信息 1.0.2
            
        - 1: 主版本号
             - 意味着大的修改， 使用者需要大的适应
        - 0: 次版本号
             - 意味着小的修改(某些函数和方法的使用或者参数有变化, 界面的小改动)
        - 2: 修订版本号
             - 程序框架/程序内部 bug 的修订， 不会对使用者造成任何影响
        - 在 appStore 每次升级应用程序 版本号都需要增加, 不能递减


     
     28. 沙盒
        
        - Document: 保存在 Document 里的内容 iTunes 会备份
        - 版本号 一般保存在 系统偏好 中比较好

     
     
     29. 自定义视图 initWithCoder 
     
        - initWithCoder 只是刚刚从 xib 中的二进制文件中将视图数据加载完成
        - 还没有和代码连线建立关系，这个方法里的 视图=nil
        - 在日常开发中不要在这个方法中处理 UI

     
     
     30. 代码评审 (Code Review)
        
        - 审查工具: phabricator
        - 评审方式:
            - code review 会议
            - 团队内部整理 check List
            - 团队内部成员交换代码
            - 提出优化方案
            - 提问代码临界点
            - 区分重点: 设计， 可读性，健壮性 等等
     
        - 好处:   
            - 统一编码风格
            - 统一编码意识
            - 不怕人员流失 代码相互了解

     

     30. xib 技巧

     -






*/


}
